﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotasModelo.Entities;
using GestorDeFlotasModelo.Factorias;
using GestorDeFlotasDesktop.UILogic;
using GestorDeFlotasDesktop.UILogic.Helpers;

namespace GestorDeFlotasDesktop.AbmReloj
{
    public partial class frmListadoReloj : BaseForm
    {
        private bool EsEliminar;
        public frmListadoReloj(bool esEliminar)
        {
            EsEliminar = esEliminar;
            InitializeComponent();
        }

        protected override void OnVisibleChanged(EventArgs e)
        {
            try
            {
                base.OnVisibleChanged(e);
                butEliminar.Visible = EsEliminar;
                butModificar.Visible = !EsEliminar;
                CargarCombos();
                CargarTodos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void CargarCombos()
        {
            List<string> marcas;
            if (Contexto.MarcasRelojes == null)
            {
                List<Reloj> autos = Transaccion.Factoria<FactoriaReloj>().SelectTodos<Reloj>();
                marcas = new List<string>();
                autos.ForEach(a => marcas.Add(a.Marca));
                marcas = marcas.Distinct().ToList();
                Contexto.MarcasRelojes = marcas;
            }
            else
                marcas = Contexto.MarcasRelojes;

            List<ComboBoxItem> items = new List<ComboBoxItem>();
            items.Add(new ComboBoxItem("", ""));
            foreach (string marca in marcas)
            {
                items.Add(new ComboBoxItem(marca, marca));
            }
            cmbMarca.ValueMember = "Value";
            cmbMarca.DisplayMember = "Text";
            cmbMarca.Items.AddRange(items.ToArray());
            cmbMarca.SelectedIndex = 0;
        }

        private void CargarTodos()
        {
            List<Reloj> relojes = Transaccion.Factoria<FactoriaReloj>().SelectTodos<Reloj>();
            SetGridData(relojes);
        }

        private void SetGridData(List<Reloj> relojes)
        {
            if (relojes != null && relojes.Count > 0)
            {
                relojes = relojes.OrderBy(x => x.NumeroDeSerie).ToList();
                GridCreation(dgvRelojes);
                dgvRelojes.DataSource = relojes;
                dgvRelojes.Visible = true;
                lblNoItems.Visible = false;

                dgvRelojes.Columns["Id"].Visible = false;
                dgvRelojes.Columns["FechaVerificacion"].HeaderText = "Fecha De Verificacion";
                dgvRelojes.Columns["FechaVerificacion"].Visible = false;
                dgvRelojes.Columns["NumeroDeSerie"].HeaderText = "Numero De Serie";
                dgvRelojes.Columns["NumeroDeSerie"].Width = 150;
            }
            else
            {
                lblNoItems.Visible = true;
                dgvRelojes.Visible = false;
            }
        }

        private void AbmReloj_Load(object sender, EventArgs e)
        {

        }

        private void butLimpiar_Click(object sender, EventArgs e)
        {
            try
            {


                txtModelo.Text = string.Empty;
                txtNroSerie.Text = string.Empty;
                cmbMarca.SelectedIndex = 0;

                CargarTodos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void butEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                Reloj relojSeleccionado;
                relojSeleccionado = (Reloj)dgvRelojes.SelectedRows[0].DataBoundItem;

                List<Auto> autos = Transaccion.Factoria<FactoriaAuto>().SelectAutosConFiltro(null, null, null, null, relojSeleccionado.Id);
                if (autos.Count > 0)
                    MessageBox.Show("El reloj que desea deshabilitar se encuentra asociado a por lo menos 1 auto", "Reloj", MessageBoxButtons.OK, MessageBoxIcon.Information);

                DialogResult dialogResult = MessageBox.Show("Esta seguro que desea eliminar el reloj seleccionado?", "Eliminar Reloj", MessageBoxButtons.YesNo);
                if (dialogResult == DialogResult.Yes)
                {
                    relojSeleccionado.Habilitado = false;
                    Transaccion.Persistir();
                    CargarConFiltros();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        public void CargarConFiltros()
        {
            List<Reloj> relojes = Transaccion.Factoria<FactoriaReloj>().SelectRelojesConFiltro(
               ((ComboBoxItem)cmbMarca.SelectedItem).Text, txtModelo.Text, txtNroSerie.Text);
            SetGridData(relojes);
        }

        private void butBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                if (!string.IsNullOrEmpty(txtNroSerie.Text) && txtNroSerie.Text.Length > 18)
                    MessageBox.Show("El numero de serie no puede superar los 18 digitos", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                else
                    CargarConFiltros();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void butModificar_Click(object sender, EventArgs e)
        {
            try
            {
                Reloj relojSeleccionado;

                if (dgvRelojes.SelectedRows.Count > 0)
                {
                    relojSeleccionado = (Reloj)dgvRelojes.SelectedRows[0].DataBoundItem;
                    new frmFormReloj(relojSeleccionado, this).Show();
                }
                else
                    MessageBox.Show("Debe seleccionar un reloj para modificar");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }

}
